--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
tests/backend/test_interface_options.py 9f71f3420c18d5800afb493b723c328d23c7ea12 (9f71f342) Text, 28.66 KB
T8b949e# SPDX-License-Identifier: 0BSD
T8b949e"""End-to-end tests for the /api/v1/reticulum/interfaces/add endpoint.
Each test exercises one interface type and asserts that the rich set of
options exposed in the UI is persisted into the Reticulum config dict.
"""
Tff7b72import T7ee787contextlib
Tff7b72import T7ee787json
Tff7b72import T7ee787shutil
Tff7b72import T7ee787socket
Tff7b72import T7ee787tempfile
Tff7b72from T7ee787unittestT7ee787.T7ee787mock Tff7b72import Te6edf3MagicMockTb4b4b4, Te6edf3patch
Tff7b72import T7ee787pytest
Tff7b72import T7ee787RNS
Tff7b72from T7ee787meshchatxT7ee787.T7ee787meshchat Tff7b72import Te6edf3ReticulumMeshChat
Tff7b72class T56d364ConfigDictTb4b4b4(Tffa657dictTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffwrite_called Tff7b72= Tff7b72False
Tff7b72def Td2a8ffwriteTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwrite_called Tff7b72= Tff7b72True
Tff7b72return Tff7b72True
Tf0883e@pytestTff7b72.Td2a8fffixture
Tff7b72def Td2a8fftemp_dirTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3path Tff7b72= Te6edf3tempfileTff7b72.Td2a8ffmkdtempTb4b4b4(Tb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72yield Te6edf3path
Tff7b72finallyTb4b4b4:
Te6edf3shutilTff7b72.Td2a8ffrmtreeTb4b4b4(Te6edf3pathTb4b4b4)
Tff7b72def Td2a8ffbuild_identityTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3identity Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3specTff7b72=Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4)
Te6edf3identityTff7b72.Td2a8ffhash Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6fftest_hash_32_bytes_long_01234567Ta5d6ff"
Te6edf3identityTff7b72.Td2a8ffhexhash Tff7b72= Te6edf3identityTff7b72.Td2a8ffhashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)
Te6edf3identityTff7b72.Td2a8ffget_private_keyTff7b72.Td2a8ffreturn_value Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6fftest_private_keyTa5d6ff"
Tff7b72return Te6edf3identity
Tff7b72async Tff7b72def Td2a8fffind_route_handlerTb4b4b4(Te6edf3app_instanceTb4b4b4, Te6edf3pathTb4b4b4, Te6edf3methodTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3route Tff7b72in Te6edf3app_instanceTff7b72.Td2a8ffget_routesTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3routeTff7b72.Td2a8ffpath Tff7b72== Te6edf3path Tff7b72and Te6edf3routeTff7b72.Td2a8ffmethod Tff7b72== Te6edf3methodTb4b4b4:
Tff7b72return Te6edf3routeTff7b72.Td2a8ffhandler
Tff7b72return Tff7b72None
Tf0883e@contextlibTff7b72.Td2a8ffasynccontextmanager
Tff7b72async Tff7b72def Td2a8ffmake_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4)Tb4b4b4:
Tff7b72with Tb4b4b4(
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.generate_ssl_certificateTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffRNS.ReticulumTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3mock_rnsTb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffRNS.TransportTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffLXMF.LXMRouterTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3mock_reticulum Tff7b72= Te6edf3mock_rnsTff7b72.Td2a8ffreturn_value
Te6edf3mock_reticulumTff7b72.Td2a8ffconfig Tff7b72= Te6edf3config
Te6edf3mock_reticulumTff7b72.Td2a8ffconfigpath Tff7b72= Ta5d6ff"Ta5d6ff/tmp/mock_configTa5d6ff"
Te6edf3mock_reticulumTff7b72.Td2a8ffis_connected_to_shared_instance Tff7b72= Tff7b72False
Te6edf3mock_reticulumTff7b72.Td2a8fftransport_enabledTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72True
Te6edf3app_instance Tff7b72= Te6edf3ReticulumMeshChatTb4b4b4(
Te6edf3identityTff7b72=Te6edf3build_identityTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3storage_dirTff7b72=Te6edf3temp_dirTb4b4b4,
Te6edf3reticulum_config_dirTff7b72=Te6edf3temp_dirTb4b4b4,
Tb4b4b4)
Te6edf3handler Tff7b72= Tff7b72await Te6edf3find_route_handlerTb4b4b4(
Te6edf3app_instanceTb4b4b4,
Ta5d6ff"Ta5d6ff/api/v1/reticulum/interfaces/addTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffPOSTTa5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72assert Te6edf3handler
Tff7b72yield Te6edf3handler
Tff7b72def Td2a8ffmake_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4:
Tff7b72class T56d364RequestTb4b4b4:
Tf0883e@staticmethod
Tff7b72async Tff7b72def Td2a8ffjsonTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3payload
Tff7b72return Te6edf3RequestTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_free_portTb4b4b4(Te6edf3kindTff7b72=Ta5d6ff"Ta5d6fftcpTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3sock_type Tff7b72= Te6edf3socketTff7b72.Td2a8ffSOCK_STREAM Tff7b72if Te6edf3kind Tff7b72== Ta5d6ff"Ta5d6fftcpTa5d6ff" Tff7b72else Te6edf3socketTff7b72.Td2a8ffSOCK_DGRAM
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffclosingTb4b4b4(Te6edf3socketTff7b72.Td2a8ffsocketTb4b4b4(Te6edf3socketTff7b72.Td2a8ffAF_INETTb4b4b4, Te6edf3sock_typeTb4b4b4)Tb4b4b4) Tff7b72as Te6edf3sockTb4b4b4:
Te6edf3sockTff7b72.Td2a8ffbindTb4b4b4(Tb4b4b4(Ta5d6ff"Ta5d6ff127.0.0.1Ta5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3sockTff7b72.Td2a8ffgetsocknameTb4b4b4(Tb4b4b4)Tb4b4b4[T79c0ff1Tb4b4b4]
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_auto_interface_persists_full_optionsTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3ConfigDictTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4}Tb4b4b4)
Tff7b72async Tff7b72with Te6edf3make_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4) Tff7b72as Te6edf3handlerTb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffAutoLANTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffAutoInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffgroup_idTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffhomelabTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdiscovery_scopeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffsiteTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdiscovery_portTa5d6ff"Tb4b4b4: T79c0ff35000Tb4b4b4,
Ta5d6ff"Ta5d6ffdata_portTa5d6ff"Tb4b4b4: T79c0ff35001Tb4b4b4,
Ta5d6ff"Ta5d6ffmulticast_address_typeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpermanentTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdevicesTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffeth0, wlan0Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffignored_devicesTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fftun0Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffconfigured_bitrateTa5d6ff"Tb4b4b4: T79c0ff5000000Tb4b4b4,
Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3make_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff200Tb4b4b4, Te6edf3body
Te6edf3saved Tff7b72= Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffAutoLANTa5d6ff"Tb4b4b4]
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffAutoInterfaceTa5d6ff"
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffgroup_idTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffhomelabTa5d6ff"
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffdiscovery_scopeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffsiteTa5d6ff"
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffdiscovery_portTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff35000
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffdata_portTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff35001
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffmulticast_address_typeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffpermanentTa5d6ff"
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffdevicesTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffeth0, wlan0Ta5d6ff"
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffignored_devicesTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6fftun0Ta5d6ff"
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffconfigured_bitrateTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff5000000
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_auto_interface_rejects_invalid_discovery_scopeTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3ConfigDictTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4}Tb4b4b4)
Tff7b72async Tff7b72with Te6edf3make_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4) Tff7b72as Te6edf3handlerTb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffAutoLANTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffAutoInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdiscovery_scopeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffouterspaceTa5d6ff"Tb4b4b4,
Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3make_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff422
Tff7b72assert Ta5d6ff"Ta5d6ffdiscovery scopeTa5d6ff" Tff7b72in Te6edf3bodyTb4b4b4[Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_auto_interface_rejects_invalid_multicast_typeTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3ConfigDictTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4}Tb4b4b4)
Tff7b72async Tff7b72with Te6edf3make_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4) Tff7b72as Te6edf3handlerTb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffAutoLANTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffAutoInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffmulticast_address_typeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffweirdTa5d6ff"Tb4b4b4,
Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3make_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff422
Tff7b72assert Ta5d6ff"Ta5d6ffmulticastTa5d6ff" Tff7b72in Te6edf3bodyTb4b4b4[Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_auto_interface_rejects_busy_data_portTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3ConfigDictTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4}Tb4b4b4)
Te6edf3busy Tff7b72= Te6edf3socketTff7b72.Td2a8ffsocketTb4b4b4(Te6edf3socketTff7b72.Td2a8ffAF_INETTb4b4b4, Te6edf3socketTff7b72.Td2a8ffSOCK_DGRAMTb4b4b4)
Te6edf3busyTff7b72.Td2a8ffbindTb4b4b4(Tb4b4b4(Ta5d6ff"Ta5d6ff127.0.0.1Ta5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4)
Te6edf3busy_port Tff7b72= Te6edf3busyTff7b72.Td2a8ffgetsocknameTb4b4b4(Tb4b4b4)Tb4b4b4[T79c0ff1Tb4b4b4]
Tff7b72tryTb4b4b4:
Tff7b72async Tff7b72with Te6edf3make_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4) Tff7b72as Te6edf3handlerTb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffAutoLANTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffAutoInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdata_portTa5d6ff"Tb4b4b4: Te6edf3busy_portTb4b4b4,
Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3make_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff409Tb4b4b4, Te6edf3body
Tff7b72assert Tffa657strTb4b4b4(Te6edf3busy_portTb4b4b4) Tff7b72in Te6edf3bodyTb4b4b4[Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4]
Tff7b72finallyTb4b4b4:
Te6edf3busyTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_tcp_client_persists_advanced_optionsTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3ConfigDictTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4}Tb4b4b4)
Tff7b72async Tff7b72with Te6edf3make_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4) Tff7b72as Te6edf3handlerTb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffTCPClientTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffTCPClientInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftarget_hostTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffexample.comTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftarget_portTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff4242Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffkiss_framingTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4,
Ta5d6ff"Ta5d6ffi2p_tunneledTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4,
Ta5d6ff"Ta5d6ffconnect_timeoutTa5d6ff"Tb4b4b4: T79c0ff12Tb4b4b4,
Ta5d6ff"Ta5d6ffmax_reconnect_triesTa5d6ff"Tb4b4b4: T79c0ff7Tb4b4b4,
Ta5d6ff"Ta5d6fffixed_mtuTa5d6ff"Tb4b4b4: T79c0ff512Tb4b4b4,
Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3make_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff200Tb4b4b4, Te6edf3body
Te6edf3saved Tff7b72= Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffTCPClientTa5d6ff"Tb4b4b4]
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffkiss_framingTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffi2p_tunneledTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffconnect_timeoutTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff12
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffmax_reconnect_triesTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff7
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6fffixed_mtuTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff512
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_tcp_client_rejects_fixed_mtu_below_reticulum_minimumTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3ConfigDictTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4}Tb4b4b4)
Tff7b72async Tff7b72with Te6edf3make_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4) Tff7b72as Te6edf3handlerTb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffTCPClientTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffTCPClientInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftarget_hostTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffexample.comTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftarget_portTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff4242Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fffixed_mtuTa5d6ff"Tb4b4b4: T79c0ff485Tb4b4b4,
Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3make_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff422Tb4b4b4, Te6edf3body
Tff7b72assert Ta5d6ff"Ta5d6fffixed_mtuTa5d6ff" Tff7b72in Te6edf3bodyTb4b4b4[Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ff500Ta5d6ff" Tff7b72in Te6edf3bodyTb4b4b4[Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4]
Tff7b72assert Ta5d6ff"Ta5d6ffTCPClientTa5d6ff" Tff7b72not Tff7b72in Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4]
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_tcp_server_persists_optional_optionsTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3ConfigDictTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4}Tb4b4b4)
Te6edf3free_port Tff7b72= Te6edf3_free_portTb4b4b4(Ta5d6ff"Ta5d6fftcpTa5d6ff"Tb4b4b4)
Tff7b72async Tff7b72with Te6edf3make_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4) Tff7b72as Te6edf3handlerTb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffTCPServerTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffTCPServerInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflisten_ipTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff127.0.0.1Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflisten_portTa5d6ff"Tb4b4b4: Te6edf3free_portTb4b4b4,
Ta5d6ff"Ta5d6ffdeviceTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffeth0Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffprefer_ipv6Ta5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4,
Ta5d6ff"Ta5d6ffi2p_tunneledTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4,
Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3make_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff200Tb4b4b4, Te6edf3body
Te6edf3saved Tff7b72= Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffTCPServerTa5d6ff"Tb4b4b4]
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffdeviceTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffeth0Ta5d6ff"
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffprefer_ipv6Ta5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffi2p_tunneledTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_tcp_server_rejects_whitespace_listen_ipTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3ConfigDictTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4}Tb4b4b4)
Tff7b72async Tff7b72with Te6edf3make_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4) Tff7b72as Te6edf3handlerTb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffTCPServerTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffTCPServerInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflisten_ipTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflisten_portTa5d6ff"Tb4b4b4: Te6edf3_free_portTb4b4b4(Ta5d6ff"Ta5d6fftcpTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3make_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff422Tb4b4b4, Te6edf3body
Tff7b72assert Ta5d6ff"Ta5d6ffListen IPTa5d6ff" Tff7b72in Te6edf3bodyTb4b4b4[Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4]
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_tcp_server_rejects_busy_listen_portTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3ConfigDictTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4}Tb4b4b4)
Te6edf3busy Tff7b72= Te6edf3socketTff7b72.Td2a8ffsocketTb4b4b4(Te6edf3socketTff7b72.Td2a8ffAF_INETTb4b4b4, Te6edf3socketTff7b72.Td2a8ffSOCK_STREAMTb4b4b4)
Te6edf3busyTff7b72.Td2a8ffbindTb4b4b4(Tb4b4b4(Ta5d6ff"Ta5d6ff127.0.0.1Ta5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4)
Te6edf3busyTff7b72.Td2a8fflistenTb4b4b4(T79c0ff1Tb4b4b4)
Te6edf3busy_port Tff7b72= Te6edf3busyTff7b72.Td2a8ffgetsocknameTb4b4b4(Tb4b4b4)Tb4b4b4[T79c0ff1Tb4b4b4]
Tff7b72tryTb4b4b4:
Tff7b72async Tff7b72with Te6edf3make_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4) Tff7b72as Te6edf3handlerTb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffTCPServerTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffTCPServerInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflisten_ipTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff127.0.0.1Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflisten_portTa5d6ff"Tb4b4b4: Te6edf3busy_portTb4b4b4,
Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3make_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff409Tb4b4b4, Te6edf3body
Tff7b72assert Tffa657strTb4b4b4(Te6edf3busy_portTb4b4b4) Tff7b72in Te6edf3bodyTb4b4b4[Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4]
Tff7b72finallyTb4b4b4:
Te6edf3busyTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_udp_rejects_busy_listen_portTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3ConfigDictTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4}Tb4b4b4)
Te6edf3busy Tff7b72= Te6edf3socketTff7b72.Td2a8ffsocketTb4b4b4(Te6edf3socketTff7b72.Td2a8ffAF_INETTb4b4b4, Te6edf3socketTff7b72.Td2a8ffSOCK_DGRAMTb4b4b4)
Te6edf3busyTff7b72.Td2a8ffbindTb4b4b4(Tb4b4b4(Ta5d6ff"Ta5d6ff127.0.0.1Ta5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4)
Te6edf3busy_port Tff7b72= Te6edf3busyTff7b72.Td2a8ffgetsocknameTb4b4b4(Tb4b4b4)Tb4b4b4[T79c0ff1Tb4b4b4]
Tff7b72tryTb4b4b4:
Tff7b72async Tff7b72with Te6edf3make_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4) Tff7b72as Te6edf3handlerTb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffUDP1Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffUDPInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflisten_ipTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff127.0.0.1Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflisten_portTa5d6ff"Tb4b4b4: Te6edf3busy_portTb4b4b4,
Ta5d6ff"Ta5d6ffforward_ipTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff255.255.255.255Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffforward_portTa5d6ff"Tb4b4b4: Te6edf3busy_portTb4b4b4,
Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3make_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff409Tb4b4b4, Te6edf3body
Tff7b72assert Ta5d6ff"Ta5d6ffUDPTa5d6ff" Tff7b72in Te6edf3bodyTb4b4b4[Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4]
Tff7b72finallyTb4b4b4:
Te6edf3busyTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_backbone_listener_mode_persists_optionsTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3ConfigDictTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4}Tb4b4b4)
Te6edf3free_port Tff7b72= Te6edf3_free_portTb4b4b4(Ta5d6ff"Ta5d6fftcpTa5d6ff"Tb4b4b4)
Tff7b72async Tff7b72with Te6edf3make_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4) Tff7b72as Te6edf3handlerTb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffBackboneListenTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffBackboneInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflisten_ipTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff127.0.0.1Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflisten_portTa5d6ff"Tb4b4b4: Te6edf3free_portTb4b4b4,
Ta5d6ff"Ta5d6ffdeviceTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffeth0Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffprefer_ipv6Ta5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4,
Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3make_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff200Tb4b4b4, Te6edf3body
Te6edf3saved Tff7b72= Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffBackboneListenTa5d6ff"Tb4b4b4]
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6fflisten_portTa5d6ff"Tb4b4b4] Tff7b72== Te6edf3free_port
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6fflisten_ipTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ff127.0.0.1Ta5d6ff"
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffdeviceTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffeth0Ta5d6ff"
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffprefer_ipv6Ta5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_backbone_connector_allows_empty_transport_identityTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3ConfigDictTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4}Tb4b4b4)
Te6edf3free_port Tff7b72= Te6edf3_free_portTb4b4b4(Ta5d6ff"Ta5d6fftcpTa5d6ff"Tb4b4b4)
Tff7b72async Tff7b72with Te6edf3make_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4) Tff7b72as Te6edf3handlerTb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffBackboneOutTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffBackboneInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftarget_hostTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff10.0.0.1Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftarget_portTa5d6ff"Tb4b4b4: Tffa657strTb4b4b4(Te6edf3free_portTb4b4b4)Tb4b4b4,
Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3make_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff200Tb4b4b4, Te6edf3body
Te6edf3saved Tff7b72= Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffBackboneOutTa5d6ff"Tb4b4b4]
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffremoteTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ff10.0.0.1Ta5d6ff"
Tff7b72assert Tffa657strTb4b4b4(Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6fftarget_portTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72== Tffa657strTb4b4b4(Te6edf3free_portTb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6fftransport_identityTa5d6ff" Tff7b72not Tff7b72in Te6edf3saved
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_external_interface_merges_extra_configTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3ConfigDictTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4}Tb4b4b4)
Tff7b72async Tff7b72with Te6edf3make_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4) Tff7b72as Te6edf3handlerTb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffWeaveTestTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffWeaveInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffextra_configTa5d6ff"Tb4b4b4: Tb4b4b4{Ta5d6ff"Ta5d6fflisten_ipTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff127.0.0.1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflisten_portTa5d6ff"Tb4b4b4: T79c0ff4242Tb4b4b4}Tb4b4b4,
Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3make_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff200Tb4b4b4, Te6edf3body
Te6edf3saved Tff7b72= Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffWeaveTestTa5d6ff"Tb4b4b4]
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffWeaveInterfaceTa5d6ff"
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6fflisten_ipTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ff127.0.0.1Ta5d6ff"
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6fflisten_portTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff4242
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_external_interface_rejects_non_object_extra_configTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3ConfigDictTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4}Tb4b4b4)
Tff7b72async Tff7b72with Te6edf3make_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4) Tff7b72as Te6edf3handlerTb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffBadTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffFooInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffextra_configTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffnot-an-objectTa5d6ff"Tb4b4b4,
Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3make_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff422
Tff7b72assert Ta5d6ff"Ta5d6ffextra_configTa5d6ff" Tff7b72in Te6edf3bodyTb4b4b4[Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_backbone_connector_mode_still_requires_remoteTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3ConfigDictTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4}Tb4b4b4)
Tff7b72async Tff7b72with Te6edf3make_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4) Tff7b72as Te6edf3handlerTb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffBackboneOutTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffBackboneInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftarget_portTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff4242Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftransport_identityTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff00Ta5d6ff" Tff7b72* T79c0ff16Tb4b4b4,
Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3make_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff422
Tff7b72assert Ta5d6ff"Ta5d6ffremoteTa5d6ff" Tff7b72in Te6edf3bodyTb4b4b4[Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_rnode_persists_flow_control_and_id_callsignTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3ConfigDictTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4}Tb4b4b4)
Tff7b72async Tff7b72with Te6edf3make_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4) Tff7b72as Te6edf3handlerTb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffRadioTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffRNodeInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff/dev/ttyUSB0Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fffrequencyTa5d6ff"Tb4b4b4: T79c0ff868000000Tb4b4b4,
Ta5d6ff"Ta5d6ffbandwidthTa5d6ff"Tb4b4b4: T79c0ff125000Tb4b4b4,
Ta5d6ff"Ta5d6fftxpowerTa5d6ff"Tb4b4b4: T79c0ff7Tb4b4b4,
Ta5d6ff"Ta5d6ffspreadingfactorTa5d6ff"Tb4b4b4: T79c0ff8Tb4b4b4,
Ta5d6ff"Ta5d6ffcodingrateTa5d6ff"Tb4b4b4: T79c0ff5Tb4b4b4,
Ta5d6ff"Ta5d6ffflow_controlTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4,
Ta5d6ff"Ta5d6ffid_callsignTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffNOCALLTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffid_intervalTa5d6ff"Tb4b4b4: T79c0ff600Tb4b4b4,
Ta5d6ff"Ta5d6ffairtime_limit_longTa5d6ff"Tb4b4b4: T79c0ff1.5Tb4b4b4,
Ta5d6ff"Ta5d6ffairtime_limit_shortTa5d6ff"Tb4b4b4: T79c0ff33.0Tb4b4b4,
Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3make_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff200Tb4b4b4, Te6edf3body
Te6edf3saved Tff7b72= Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffRadioTa5d6ff"Tb4b4b4]
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffflow_controlTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffid_callsignTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffNOCALLTa5d6ff"
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffid_intervalTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff600
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffairtime_limit_longTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff1.5
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffairtime_limit_shortTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff33.0
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_rnode_ble_uart_port_persistedTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3ConfigDictTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4}Tb4b4b4)
Tff7b72async Tff7b72with Te6edf3make_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4) Tff7b72as Te6edf3handlerTb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffRadioBLETa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffRNodeInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffble://aa:bb:cc:dd:ee:ffTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fffrequencyTa5d6ff"Tb4b4b4: T79c0ff868000000Tb4b4b4,
Ta5d6ff"Ta5d6ffbandwidthTa5d6ff"Tb4b4b4: T79c0ff125000Tb4b4b4,
Ta5d6ff"Ta5d6fftxpowerTa5d6ff"Tb4b4b4: T79c0ff7Tb4b4b4,
Ta5d6ff"Ta5d6ffspreadingfactorTa5d6ff"Tb4b4b4: T79c0ff8Tb4b4b4,
Ta5d6ff"Ta5d6ffcodingrateTa5d6ff"Tb4b4b4: T79c0ff5Tb4b4b4,
Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3make_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff200Tb4b4b4, Te6edf3body
Tff7b72assert Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffRadioBLETa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffble://aa:bb:cc:dd:ee:ffTa5d6ff"
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_rnode_tcp_over_ip_normalizes_to_host_onlyTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3ConfigDictTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4}Tb4b4b4)
Tff7b72async Tff7b72with Te6edf3make_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4) Tff7b72as Te6edf3handlerTb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffRNodeWiFiTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffRNodeIPInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fftcp://192.168.4.1:7633Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fffrequencyTa5d6ff"Tb4b4b4: T79c0ff868000000Tb4b4b4,
Ta5d6ff"Ta5d6ffbandwidthTa5d6ff"Tb4b4b4: T79c0ff125000Tb4b4b4,
Ta5d6ff"Ta5d6fftxpowerTa5d6ff"Tb4b4b4: T79c0ff7Tb4b4b4,
Ta5d6ff"Ta5d6ffspreadingfactorTa5d6ff"Tb4b4b4: T79c0ff8Tb4b4b4,
Ta5d6ff"Ta5d6ffcodingrateTa5d6ff"Tb4b4b4: T79c0ff5Tb4b4b4,
Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3make_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff200Tb4b4b4, Te6edf3body
Tff7b72assert Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffRNodeWiFiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6fftcp://192.168.4.1Ta5d6ff"
T8b949e# RNS's Android-specific RNodeInterface reads tcp_host as its own
T8b949e# config key instead of parsing it out of port like desktop does.
Tff7b72assert Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffRNodeWiFiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fftcp_hostTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ff192.168.4.1Ta5d6ff"
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_rnode_over_ip_allowed_on_android_without_usbserial4a_or_jniusTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
T8b949e"""RNode over TCP needs no native Android modules and must not be blocked."""
Te6edf3config Tff7b72= Te6edf3ConfigDictTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4}Tb4b4b4)
Tff7b72async Tff7b72with Te6edf3make_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4) Tff7b72as Te6edf3handlerTb4b4b4:
Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat._is_chaquopy_androidTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffRNodeWiFiTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffRNodeIPInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fftcp://192.168.4.1:7633Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fffrequencyTa5d6ff"Tb4b4b4: T79c0ff868000000Tb4b4b4,
Ta5d6ff"Ta5d6ffbandwidthTa5d6ff"Tb4b4b4: T79c0ff125000Tb4b4b4,
Ta5d6ff"Ta5d6fftxpowerTa5d6ff"Tb4b4b4: T79c0ff7Tb4b4b4,
Ta5d6ff"Ta5d6ffspreadingfactorTa5d6ff"Tb4b4b4: T79c0ff8Tb4b4b4,
Ta5d6ff"Ta5d6ffcodingrateTa5d6ff"Tb4b4b4: T79c0ff5Tb4b4b4,
Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3make_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff200Tb4b4b4, Te6edf3body
Tff7b72assert Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffRNodeWiFiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fftcp_hostTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ff192.168.4.1Ta5d6ff"
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_rnode_serial_blocked_on_android_without_usbserial4a_or_jniusTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3ConfigDictTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4}Tb4b4b4)
Tff7b72async Tff7b72with Te6edf3make_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4) Tff7b72as Te6edf3handlerTb4b4b4:
Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat._is_chaquopy_androidTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffRadioTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffRNodeInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff/dev/ttyUSB0Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fffrequencyTa5d6ff"Tb4b4b4: T79c0ff868000000Tb4b4b4,
Ta5d6ff"Ta5d6ffbandwidthTa5d6ff"Tb4b4b4: T79c0ff125000Tb4b4b4,
Ta5d6ff"Ta5d6fftxpowerTa5d6ff"Tb4b4b4: T79c0ff7Tb4b4b4,
Ta5d6ff"Ta5d6ffspreadingfactorTa5d6ff"Tb4b4b4: T79c0ff8Tb4b4b4,
Ta5d6ff"Ta5d6ffcodingrateTa5d6ff"Tb4b4b4: T79c0ff5Tb4b4b4,
Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3make_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff422Tb4b4b4, Te6edf3body
Tff7b72assert Ta5d6ff"Ta5d6ffRNode over IPTa5d6ff" Tff7b72in Te6edf3bodyTb4b4b4[Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4]
Tff7b72assert Ta5d6ff"Ta5d6ffissue #Ta5d6ff" Tff7b72not Tff7b72in Te6edf3bodyTb4b4b4[Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ffgithubTa5d6ff" Tff7b72not Tff7b72in Te6edf3bodyTb4b4b4[Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ffRadioTa5d6ff" Tff7b72not Tff7b72in Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4]
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_rnode_multi_interface_blocked_on_androidTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
T8b949e"""RNS has no Android-specific implementation of RNodeMultiInterface."""
Te6edf3config Tff7b72= Te6edf3ConfigDictTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4}Tb4b4b4)
Tff7b72async Tff7b72with Te6edf3make_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4) Tff7b72as Te6edf3handlerTb4b4b4:
Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat._is_chaquopy_androidTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffMultiRadioTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffRNodeMultiInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff/dev/ttyUSB0Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffsub_interfacesTa5d6ff"Tb4b4b4: Tb4b4b4[
Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffvport0Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fffrequencyTa5d6ff"Tb4b4b4: T79c0ff868000000Tb4b4b4,
Ta5d6ff"Ta5d6ffbandwidthTa5d6ff"Tb4b4b4: T79c0ff125000Tb4b4b4,
Ta5d6ff"Ta5d6fftxpowerTa5d6ff"Tb4b4b4: T79c0ff7Tb4b4b4,
Ta5d6ff"Ta5d6ffspreadingfactorTa5d6ff"Tb4b4b4: T79c0ff8Tb4b4b4,
Ta5d6ff"Ta5d6ffcodingrateTa5d6ff"Tb4b4b4: T79c0ff5Tb4b4b4,
Ta5d6ff"Ta5d6ffvportTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3make_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff422Tb4b4b4, Te6edf3body
Tff7b72assert Ta5d6ff"Ta5d6ffnot supported on AndroidTa5d6ff" Tff7b72in Te6edf3bodyTb4b4b4[Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4]
Tff7b72assert Ta5d6ff"Ta5d6ffMultiRadioTa5d6ff" Tff7b72not Tff7b72in Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4]
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_rnode_tcp_over_ip_rejects_empty_hostTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3ConfigDictTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4}Tb4b4b4)
Tff7b72async Tff7b72with Te6edf3make_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4) Tff7b72as Te6edf3handlerTb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffBadTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffRNodeIPInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fftcp://Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fffrequencyTa5d6ff"Tb4b4b4: T79c0ff868000000Tb4b4b4,
Ta5d6ff"Ta5d6ffbandwidthTa5d6ff"Tb4b4b4: T79c0ff125000Tb4b4b4,
Ta5d6ff"Ta5d6fftxpowerTa5d6ff"Tb4b4b4: T79c0ff7Tb4b4b4,
Ta5d6ff"Ta5d6ffspreadingfactorTa5d6ff"Tb4b4b4: T79c0ff8Tb4b4b4,
Ta5d6ff"Ta5d6ffcodingrateTa5d6ff"Tb4b4b4: T79c0ff5Tb4b4b4,
Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3make_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff422Tb4b4b4, Te6edf3body
Tff7b72assert Ta5d6ff"Ta5d6ffTCP hostTa5d6ff" Tff7b72in Te6edf3bodyTb4b4b4[Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4]
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_rnode_frequency_mhz_decimal_normalized_to_hzTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3ConfigDictTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4}Tb4b4b4)
Tff7b72async Tff7b72with Te6edf3make_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4) Tff7b72as Te6edf3handlerTb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffRadioEUTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffRNodeInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff/dev/ttyUSB0Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fffrequencyTa5d6ff"Tb4b4b4: T79c0ff868.825Tb4b4b4,
Ta5d6ff"Ta5d6ffbandwidthTa5d6ff"Tb4b4b4: T79c0ff125000Tb4b4b4,
Ta5d6ff"Ta5d6fftxpowerTa5d6ff"Tb4b4b4: T79c0ff7Tb4b4b4,
Ta5d6ff"Ta5d6ffspreadingfactorTa5d6ff"Tb4b4b4: T79c0ff8Tb4b4b4,
Ta5d6ff"Ta5d6ffcodingrateTa5d6ff"Tb4b4b4: T79c0ff5Tb4b4b4,
Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3make_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff200Tb4b4b4, Te6edf3body
Tff7b72assert Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffRadioEUTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fffrequencyTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff868825000
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_rnode_rejects_invalid_txpowerTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3ConfigDictTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4}Tb4b4b4)
Tff7b72async Tff7b72with Te6edf3make_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4) Tff7b72as Te6edf3handlerTb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffRadioBadTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffRNodeInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff/dev/ttyUSB0Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fffrequencyTa5d6ff"Tb4b4b4: T79c0ff868000000Tb4b4b4,
Ta5d6ff"Ta5d6ffbandwidthTa5d6ff"Tb4b4b4: T79c0ff125000Tb4b4b4,
Ta5d6ff"Ta5d6fftxpowerTa5d6ff"Tb4b4b4: Tff7b72-T79c0ff9Tb4b4b4,
Ta5d6ff"Ta5d6ffspreadingfactorTa5d6ff"Tb4b4b4: T79c0ff8Tb4b4b4,
Ta5d6ff"Ta5d6ffcodingrateTa5d6ff"Tb4b4b4: T79c0ff5Tb4b4b4,
Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3make_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff422Tb4b4b4, Te6edf3body
Tff7b72assert Ta5d6ff"Ta5d6ffTX powerTa5d6ff" Tff7b72in Te6edf3bodyTb4b4b4[Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4]
Tff7b72assert Ta5d6ff"Ta5d6ffRadioBadTa5d6ff" Tff7b72not Tff7b72in Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4]
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_rnode_normalizes_txpower_to_integerTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3ConfigDictTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4}Tb4b4b4)
Tff7b72async Tff7b72with Te6edf3make_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4) Tff7b72as Te6edf3handlerTb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffRadioTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffRNodeInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff/dev/ttyUSB0Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fffrequencyTa5d6ff"Tb4b4b4: T79c0ff868000000Tb4b4b4,
Ta5d6ff"Ta5d6ffbandwidthTa5d6ff"Tb4b4b4: T79c0ff125000Tb4b4b4,
Ta5d6ff"Ta5d6fftxpowerTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff14.0Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffspreadingfactorTa5d6ff"Tb4b4b4: T79c0ff8Tb4b4b4,
Ta5d6ff"Ta5d6ffcodingrateTa5d6ff"Tb4b4b4: T79c0ff5Tb4b4b4,
Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3make_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff200Tb4b4b4, Te6edf3body
Tff7b72assert Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffRadioTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fftxpowerTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff14
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_kiss_persists_full_serial_optionsTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3ConfigDictTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4}Tb4b4b4)
Tff7b72async Tff7b72with Te6edf3make_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4) Tff7b72as Te6edf3handlerTb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffKISSRadioTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffKISSInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff/dev/ttyACM0Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffspeedTa5d6ff"Tb4b4b4: T79c0ff19200Tb4b4b4,
Ta5d6ff"Ta5d6ffdatabitsTa5d6ff"Tb4b4b4: T79c0ff8Tb4b4b4,
Ta5d6ff"Ta5d6ffparityTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffNTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffstopbitsTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Ta5d6ff"Ta5d6ffpreambleTa5d6ff"Tb4b4b4: T79c0ff200Tb4b4b4,
Ta5d6ff"Ta5d6fftxtailTa5d6ff"Tb4b4b4: T79c0ff30Tb4b4b4,
Ta5d6ff"Ta5d6ffpersistenceTa5d6ff"Tb4b4b4: T79c0ff128Tb4b4b4,
Ta5d6ff"Ta5d6ffslottimeTa5d6ff"Tb4b4b4: T79c0ff25Tb4b4b4,
Ta5d6ff"Ta5d6ffflow_controlTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4,
Ta5d6ff"Ta5d6ffid_callsignTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffBEACONTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffid_intervalTa5d6ff"Tb4b4b4: T79c0ff1200Tb4b4b4,
Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3make_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff200Tb4b4b4, Te6edf3body
Te6edf3saved Tff7b72= Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffKISSRadioTa5d6ff"Tb4b4b4]
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffspeedTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff19200
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffdatabitsTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff8
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffparityTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffNTa5d6ff"
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffstopbitsTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff1
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffpreambleTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff200
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6fftxtailTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff30
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffpersistenceTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff128
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffslottimeTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff25
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffflow_controlTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffid_callsignTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffBEACONTa5d6ff"
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffid_intervalTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff1200
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_ax25_kiss_persists_callsign_and_ssidTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3ConfigDictTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4}Tb4b4b4)
Tff7b72async Tff7b72with Te6edf3make_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4) Tff7b72as Te6edf3handlerTb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffAX25Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffAX25KISSInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff/dev/ttyACM1Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffcallsignTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffN0CALLTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffssidTa5d6ff"Tb4b4b4: T79c0ff7Tb4b4b4,
Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3make_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff200Tb4b4b4, Te6edf3body
Te6edf3saved Tff7b72= Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffAX25Ta5d6ff"Tb4b4b4]
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffcallsignTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffN0CALLTa5d6ff"
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffssidTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff7
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_i2p_connectable_can_be_disabledTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3ConfigDictTb4b4b4(
Tb4b4b4{
Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4: Tb4b4b4{Ta5d6ff"Ta5d6ffenable_transportTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffTrueTa5d6ff"Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tff7b72async Tff7b72with Te6edf3make_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4) Tff7b72as Te6edf3handlerTb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffI2POutTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffI2PInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffpeersTa5d6ff"Tb4b4b4: Tb4b4b4[Ta5d6ff"Ta5d6ffabcdef.b32.i2pTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffconnectableTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3make_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff200Tb4b4b4, Te6edf3body
Te6edf3saved Tff7b72= Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffI2POutTa5d6ff"Tb4b4b4]
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffconnectableTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffFalseTa5d6ff"
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffpeersTa5d6ff"Tb4b4b4] Tff7b72== Tb4b4b4[Ta5d6ff"Ta5d6ffabcdef.b32.i2pTa5d6ff"Tb4b4b4]
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_internal_mode_and_rns_bool_options_persistTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3ConfigDictTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4}Tb4b4b4)
Te6edf3free_port Tff7b72= Te6edf3_free_portTb4b4b4(Ta5d6ff"Ta5d6fftcpTa5d6ff"Tb4b4b4)
Tff7b72async Tff7b72with Te6edf3make_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4) Tff7b72as Te6edf3handlerTb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffInternalTCPTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffTCPServerInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflisten_ipTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff127.0.0.1Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflisten_portTa5d6ff"Tb4b4b4: Te6edf3free_portTb4b4b4,
Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffinternalTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffrecursive_prsTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4,
Ta5d6ff"Ta5d6ffannounces_from_internalTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3make_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff200Tb4b4b4, Te6edf3body
Te6edf3saved Tff7b72= Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffInternalTCPTa5d6ff"Tb4b4b4]
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffinternalTa5d6ff"
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffrecursive_prsTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffyesTa5d6ff"
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffannounces_from_internalTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffnoTa5d6ff"
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_rejects_unknown_interface_modeTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3ConfigDictTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4}Tb4b4b4)
Te6edf3free_port Tff7b72= Te6edf3_free_portTb4b4b4(Ta5d6ff"Ta5d6fftcpTa5d6ff"Tb4b4b4)
Tff7b72async Tff7b72with Te6edf3make_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4) Tff7b72as Te6edf3handlerTb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffBadModeTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffTCPServerInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflisten_ipTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff127.0.0.1Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflisten_portTa5d6ff"Tb4b4b4: Te6edf3free_portTb4b4b4,
Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffwarehouseTa5d6ff"Tb4b4b4,
Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3make_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff422Tb4b4b4, Te6edf3body
Tff7b72assert Ta5d6ff"Ta5d6ffmodeTa5d6ff" Tff7b72in Te6edf3bodyTb4b4b4[Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ffBadModeTa5d6ff" Tff7b72not Tff7b72in Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4]
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_rejects_unsafe_location_cmdTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3ConfigDictTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4}Tb4b4b4)
Te6edf3free_port Tff7b72= Te6edf3_free_portTb4b4b4(Ta5d6ff"Ta5d6fftcpTa5d6ff"Tb4b4b4)
Tff7b72async Tff7b72with Te6edf3make_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4) Tff7b72as Te6edf3handlerTb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffDiscoTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffTCPServerInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflisten_ipTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff127.0.0.1Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflisten_portTa5d6ff"Tb4b4b4: Te6edf3free_portTb4b4b4,
Ta5d6ff"Ta5d6ffdiscoverableTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffyesTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffgatewayTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflocation_cmdTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff/tmp/gps; rm -rf /Ta5d6ff"Tb4b4b4,
Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3make_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff422Tb4b4b4, Te6edf3body
Tff7b72assert Ta5d6ff"Ta5d6fflocation_cmdTa5d6ff" Tff7b72in Te6edf3bodyTb4b4b4[Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4]
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_backbone_listener_fast_flapping_optionsTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3ConfigDictTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4}Tb4b4b4)
Te6edf3free_port Tff7b72= Te6edf3_free_portTb4b4b4(Ta5d6ff"Ta5d6fftcpTa5d6ff"Tb4b4b4)
Tff7b72async Tff7b72with Te6edf3make_appTb4b4b4(Te6edf3temp_dirTb4b4b4, Te6edf3configTb4b4b4) Tff7b72as Te6edf3handlerTb4b4b4:
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffBackboneFlapTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffBackboneInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflisten_ipTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff127.0.0.1Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflisten_portTa5d6ff"Tb4b4b4: Te6edf3free_portTb4b4b4,
Ta5d6ff"Ta5d6ffblock_fast_flappingTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4,
Ta5d6ff"Ta5d6fffast_flapping_block_timeTa5d6ff"Tb4b4b4: T79c0ff60Tb4b4b4,
Ta5d6ff"Ta5d6fffast_flapping_thresholdTa5d6ff"Tb4b4b4: T79c0ff15Tb4b4b4,
Ta5d6ff"Ta5d6fffast_flapping_graceTa5d6ff"Tb4b4b4: T79c0ff3Tb4b4b4,
Tb4b4b4}
Te6edf3response Tff7b72= Tff7b72await Te6edf3handlerTb4b4b4(Te6edf3make_requestTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3body Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff200Tb4b4b4, Te6edf3body
Te6edf3saved Tff7b72= Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffBackboneFlapTa5d6ff"Tb4b4b4]
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6ffblock_fast_flappingTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffyesTa5d6ff"
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6fffast_flapping_block_timeTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff60
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6fffast_flapping_thresholdTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff15
Tff7b72assert Te6edf3savedTb4b4b4[Ta5d6ff"Ta5d6fffast_flapping_graceTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff3
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────